package com.showsu.editor.session;

import java.io.Serializable;
import java.util.Set;

/**
 * @Author: William
 * @Description: 会话接口
 * @Date: Created in 10:51 上午 2024/9/20
 * @Modified By:
 */
public interface ISession {

    /**
     * 获取会话ID
     *
     * @return
     * @throws SessionException
     */
    String getSessionId() throws SessionException;

    /**
     * 获取用户ID
     *
     * @return
     * @throws SessionException
     */
    Long getUserId() throws SessionException;

    /**
     * 获取会话的属性
     *
     * @param attrName
     * @return
     * @throws SessionException
     */
    Serializable getAttribute(String attrName) throws SessionException;

    /**
     * 可以通过设置返回类型，而获取属性
     *
     * @param attrName
     * @param type
     * @return
     * @throws SessionException
     */
    <T extends Serializable> T getAttribute(String attrName, Class<T> type) throws SessionException;

    /**
     * 删除会话的属性
     *
     * @param attrName
     * @return
     * @throws SessionException
     */
    boolean removeAttribute(String attrName) throws SessionException;

    /**
     * 是否包含某个属性
     *
     * @param attrName
     * @return
     */
    boolean containAttributeName(String attrName);

    /**
     * 设置属性，会话的属性都有有效期，这个方法将使用系统默认的有效期设置
     *
     * @param attrName
     * @param value
     * @throws SessionException
     */
    void setAttribute(String attrName, Serializable value) throws SessionException;

    /**
     * 设置属性，并设置会话的有效期时间，单位为秒
     *
     * @param attrName
     * @param value
     * @throws SessionException
     */
    void setAppAttribute(String attrName, Serializable value) throws SessionException;

    /**
     * 设置属性，并设置会话的有效期时间，单位为秒
     *
     * @param attrName
     * @param value
     * @param expiryTime
     * @throws SessionException
     */
    void setAttribute(String attrName, Serializable value, int expiryTime) throws SessionException;

    /**
     * 获取会话中所有的属性名称
     *
     * @return
     * @throws SessionException
     */
    Set<String> getAllAttributeKeys() throws SessionException;
}
